package com.cy.pj.common.pool;

import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * 创建一个对象池类型，然后将次类型的对象交给spring管理
 * @Component 此注解描述的对象可以交给spring去管理，例如创建bean实例，给bean起一个默认名字
 * 系统底层会通过反射技术创建bean实例，并未Bean起一个名字
 *
 * 反射 -- Java中的一种高级特性，这组特性会借助一组
 *  不能预知未来，但可以驾驭未来
 *
 * 起点：获取Class对象(字节码对象)
 *
 * Ctrl + N    Ctrl + F12
 *
 * 低耗、高效
 * 合理规划资源
 * 面试 spring的作用域
 * 面试 spring延迟加载
 */
@Component
@Scope("singleton") // 配合@Lazy一起使用 会存到Bean池
//@Scope("prototype") // 不需要@Lazy 不会存储到spring容器
@Lazy // 描述对象类型时，表示延迟对象的创建，何时需要何时创建，尤其是一些大对象，短时间又不不会用到
//@Component("objectPool")// 描述bean的同时，给Bean起个名字
public class ObjectPool {// 默认bean对象的名字为类名，然后首字母小写，例如objectPool
    byte[] arr = new byte[1024*1024*1024];

    public ObjectPool() {
        System.out.println("我被创建实例了");
        Integer i = 100;
    }

    // 生命周期方法 : 池对象中
    @PostConstruct // 对象生命周期初始化方法，构造方法之后执行
    public void init() {
        System.out.println("init");
    }

    @PreDestroy // 销毁方法，对象销毁之前执行，
    public void destory() {
        System.out.println("destory");
    }
}
